/*
 * JDialogCrearComponenteManual.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Created on 25/01/2011, 07:12:31 AM
 */

package com.ufps.cuatro.vistas;

import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.tree.DefaultMutableTreeNode;

import org.jdesktop.application.Action;

import com.ufps.cuatro.CuatroApp;
import com.ufps.cuatro.controlador.UtilController;
import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.ModeloAsociado;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.TipoColeccionModeloAsociado;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGenerador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorUnitario;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoSimple;
import com.ufps.cuatro.util.Bandera;
import com.ufps.cuatro.util.InformacionNodo;
import com.ufps.cuatro.util.ItemViewContenedor;
import com.ufps.cuatro.util.TipoItemViewContenedor;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBase;
import com.ufps.cuatro.util.base.ComponenteBasePersonalizado;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.base.TipoDatoRepresentacionBase;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;
import com.ufps.cuatro.vistas.representacion.JDialogSeleccionComponente;
import com.ufps.cuatro.vistas.representacion.JPanelOpcionesBeansAbstractList;

/**
 *<i><b>JDialogCrearComponenteManual:</b></i><p>Este dialogo se encarga de Crear
 * <code>Componente</code>s que representarán áreas de una interfaz gráfica
 * de forma manual.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 25/01/2011
 * @see javax.swing.JDialog
 * @see Observer
 */
public class JDialogCrearComponenteManual extends javax.swing.JDialog implements Observer {
    private static final long serialVersionUID = 7628695794690641236L;    
    
    private Object objParent;    
    private Object objSeleccionado;    
    private InformacionNodo objNodoSeleccionado;   
    
    private ObjetoTipoDatoReflexion objTipoDato;
    private ObjetoTipoDatoReflexion objTipoDatoGenericoKey;
    private ObjetoTipoDatoReflexion objTipoDatoGenericoObject;
    
    private ComponenteDistribuidor objComponenteDistribuidorBeansObject;
    private ComponenteDistribuidor objComponenteDistribuidorBeansKey;    
    
    private int opcionModoCreacionComponente;
    private boolean existeRepresentacionGenericaParaTipoDatoGenericoKey = false;
    private boolean existeRepresentacionGenericaParaTipoDatoGenericoObject = false;
    private boolean tipoDatoIncluyeGenerico = false;
    private boolean tipoDatoEsColeccion = false;
    private boolean tipoDatoPermiteModeloAsociadoObject = false; 
    private boolean tipoDatoPermiteModeloAsociadoKey = false; 
    
    private boolean componentePermiteModeloAsociado = false;    
    
    private ArrayList<ComponenteBaseStandar> objComponentesBasicos;
    private ArrayList<ComponenteBaseStandar> objComponentesBasicosRecomendados;
    private ArrayList<ComponenteBasePersonalizado> objComponentesPersonalizados;
    private ArrayList<ComponenteBasePersonalizado> objComponentesPersonalizadosRecomendados;
    
    private ComponenteGeneradoSimple objComponenteGenerado;
    private ComponenteDistribuidorExtra objComponenteExtra;
    private ComponenteDistribuidorGenerador objComponenteGenerador;    

    /** 
     * Creates new form JDialogCrearComponenteManual
     * @param parent Referencia a la Ventana Padre.
     * @param modal  Modo de Visualización (Modal - No Modal).
     */
    public JDialogCrearComponenteManual(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
    }

    /** 
     * Creates new form JDialogCrearComponenteManual
     * @param objParent  Referencia a la Ventana Padre.
     * @param opcionModoCreacionComponente Modo de Visualización (Modal - No Modal).
     */
    public JDialogCrearComponenteManual(Object objParent, int opcionModoCreacionComponente) {
        super(CuatroApp.getApplication().getMainFrame() , true);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.objParent = objParent;        
        this.opcionModoCreacionComponente = opcionModoCreacionComponente;                           
        UtilRender.helperIconInformationLabel(jLabelClassPathTipoDato, "No Aplica.");        
        initBotonesModeloAsociado();
        cargarComponentes();    
        initArboles();
        initTabbedPane();
        UtilRender.helperIconInformationLabel(jLabelInfo, "Representación Manual.");
        UtilRender.helperIconInformationLabel(jLabelComponente, "No Instanciado.");
        cargarNoPanelOpcion(jTabbedPaneOpciones, "Opciones - Contenedor", "No Disponible");
        cargarNoPanelOpcion(jTabbedPaneAvanzado, "Opciones Avanzadas", "No Disponible");
    }
    
    /**
     * Creates new form JDialogCrearComponenteManual.
     * @param objParent Referencia de la Ventana Padre.
     * @param objTipoDato Tipo de Dato del Modelo Analizado.
     */
    public JDialogCrearComponenteManual(Object objParent, ObjetoTipoDatoReflexion objTipoDato) {
        super(CuatroApp.getApplication().getMainFrame() , true);
        initComponents();
        this.setIconImage(Utileria.leerIconoAppEnImagen(Utileria.MODO_16x16).getImage());
        this.objParent = objParent;             
        this.opcionModoCreacionComponente = Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO;                           
        initFromRepresentaciones(objTipoDato);        
        initBotonesModeloAsociado();
        cargarComponentes();    
        initArboles();
        initTabbedPane();
        UtilRender.helperIconInformationLabel(jLabelInfo, "Representación Manual.");
        UtilRender.helperIconInformationLabel(jLabelComponente, "No Instanciado.");
        cargarNoPanelOpcion(jTabbedPaneOpciones, "Opciones - Contenedor", "No Disponible");
        cargarNoPanelOpcion(jTabbedPaneAvanzado, "Opciones Avanzadas", "No Disponible");
    }
    
    private void initFromRepresentaciones(ObjetoTipoDatoReflexion objTipoDato){        
        this.objTipoDato = objTipoDato;            
        UtilRender.helperIconInformationLabel(jLabelClassPathTipoDato, objTipoDato.getStrClassPath());
        tipoDatoEsColeccion = objTipoDato.esColeccion();
        tipoDatoIncluyeGenerico = objTipoDato.contieneRepresentacionesGenericas();                
        if(tipoDatoIncluyeGenerico){            
            if(objTipoDato.getObjTiposGenericos().size() == 1){
                objTipoDatoGenericoObject = objTipoDato.getObjTiposGenericos().get(0);
                existeRepresentacionGenericaParaTipoDatoGenericoObject = UtilRepresentacion.objBibliotecaTrabajoLocal.existeComponenteGeneradorPorTipoDato(objTipoDatoGenericoObject);
            }
            else if(objTipoDato.getObjTiposGenericos().size() == 2){
                objTipoDatoGenericoKey = objTipoDato.getObjTiposGenericos().get(0);
                objTipoDatoGenericoObject = objTipoDato.getObjTiposGenericos().get(1);
                existeRepresentacionGenericaParaTipoDatoGenericoKey = UtilRepresentacion.objBibliotecaTrabajoLocal.existeComponenteGeneradorPorTipoDato(objTipoDatoGenericoKey);
                existeRepresentacionGenericaParaTipoDatoGenericoObject = UtilRepresentacion.objBibliotecaTrabajoLocal.existeComponenteGeneradorPorTipoDato(objTipoDatoGenericoObject);
            }
        }
        TipoDatoRepresentacionBase objTipoDatoRepresentacionBase = GeneradorComponentes.devolverTipoDatoRepresentacionBasePorTipoDato(objTipoDato);
        tipoDatoPermiteModeloAsociadoKey = objTipoDatoRepresentacionBase.isCollectionKey();
        tipoDatoPermiteModeloAsociadoObject = objTipoDatoRepresentacionBase.isCollectionObject();
    }
    
    private void initTabbedPane(){
        this.jTabbedPaneComponente.setSelectedIndex(0);
        this.jTabbedPaneModeloAsociado.setSelectedIndex(0);
        this.jTabbedPaneModeloAsociadoKey.setSelectedIndex(0);
        this.jTabbedPaneModeloAsociadoObject.setSelectedIndex(0);
    }
    
    private void initBotonesModeloAsociado(){
        this.jButtonModeloAsociadoObject.setEnabled(false);
        this.jButtonDelModeloAsociadoObject.setEnabled(false);
        this.jButtonModeloAsociadoKey.setEnabled(false);
        this.jButtonDelModeloAsociadoKey.setEnabled(false);
    }
    
    private void initArboles(){
        cargarArbolComponenteParent();
        cargarArbolComponenteDistribuidorBeansKey();
        cargarArbolComponenteBeansKey();
        cargarArbolComponenteDistribuidorBeansObject();
        cargarArbolComponenteBeansObject();
    }    

    private void crearComponentePorSeleccion() {
        //Ingreso Automático
        if(this.jComboBoxComponentes.getSelectedIndex() >= 0){                
            if(this.jComboBoxComponentes.getSelectedItem() instanceof ComponenteBaseStandar){
                if(crearComponenteFromComponenteBase()){
                    cargarArbolComponenteParent();
                }
            }
            else if(this.jComboBoxComponentes.getSelectedItem() instanceof ComponenteBasePersonalizado){
                if(crearComponenteFromComponentePersonalizadoBase()){
                    cargarArbolComponenteParent();
                }
            }                              
        }
        else{
            UtilRender.msgAdvertencia("Debe Seleccionar un Control Swing.");
        }
    }
    
    private void cargarComponentes(){
        ArrayList<ItemViewContenedor> objItems = null;        
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_EXTRA:
                objItems = prepararCreacionComponenteExtra();
                break;
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                objItems = prepararCreacionComponenteGenerador();
                break;
            case Utileria.CREAR_COMPONENTE_GENERADO:                
                objItems = prepararCreacionComponenteGenerado();
                break;            
        }         
        JComboBox objCombo = new JComboBox(objItems.toArray());        
        this.jComboBoxTiposGeneracion.setModel(objCombo.getModel());
        if(this.jComboBoxTiposGeneracion.getItemCount() > 0){            
            this.jComboBoxTiposGeneracion.setSelectedIndex(0);
        }
    }
    
    private boolean validacionModeloAsociadoPorComponente(TipoColeccionModeloAsociado objTipoColeccionModeloAsociado){
        if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractList){
            if (objComponenteDistribuidorBeansObject == null) {
                return UtilRender.msgConfirmar("Este Control Soporta Modelos Asociados para List<E>,\n" + 
                        "sin embargo no tiene asociada la Representación para el Elemento [E - Object].\n" + 
                         "Tenga en cuenta que si no lo agrega deberá configurar el funcionamento del control manualmente.\n" +
                         "¿Desea Continuar y configurar manualmente el funcionamiento de Control?");                    
            }
        }        
        else if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractMap){                            
            if (objComponenteDistribuidorBeansKey == null && objComponenteDistribuidorBeansObject != null) {                    
                UtilRender.msgAdvertencia("Este Control Soporta Modelos Asociados para Map<K, V>, sin embargo no tiene asociada\n" + 
                         "la representación para el Elemento [K - Key] de la Colección.\n" +
                         "No se permiten Representaciones parciales para el Modelo Asociado.");
                return false;                
            }
            else if (objComponenteDistribuidorBeansKey != null && objComponenteDistribuidorBeansObject == null) {
                UtilRender.msgConfirmar("Este Control Soporta Modelos Asociados para Map<K, V>, sin embargo no tiene asociada\n" + 
                         "la representación para el Elemento [V - Object] de la Colección.\n" +
                         "No se permiten Representaciones parciales para el Modelo Asociado.");
                return false;                
            }
            else if (objComponenteDistribuidorBeansKey == null && objComponenteDistribuidorBeansObject == null) {
                if (!UtilRender.msgConfirmar("Este Control Soporta Modelos Asociados para Map<K, V>, sin embargo no tiene asociada\n" + 
                         "una representación.\n" +
                         "Tenga en cuenta que si no lo agrega deberá configurar el funcionamento del control manualmente.\n" +
                         "¿Desea Continuar y configurar manualmente el funcionamiento de Control?")){
                    return false;
                }
            }                 
        }    
        return true;
    }
    
    private boolean validacionModeloAsociadoPorTipoDato(TipoColeccionModeloAsociado objTipoColeccionModeloAsociado){
        String strClassPathTipoDato = objTipoDato.getStrClassPath();
        String strClassPathComponente = objComponenteGenerador.getStrClassPath();
        if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractList){                            
            String strClassPathObject = objTipoDato.getObjTiposGenericos().get(0).getStrClassPath();                
            if(existeRepresentacionGenericaParaTipoDatoGenericoObject){
                if (componentePermiteModeloAsociado) {
                    if (objComponenteDistribuidorBeansObject == null) {
                        UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados List<E> para el Tipo Genérico: <" + strClassPathObject + ">,\n" +
                                "sin embargo no tiene representación asociada.\n" + 
                                "La Representación Genérica es Requerida para Continuar.");                    
                        return false;
                    }
                }
                else{
                    UtilRender.msgInformacion("El Control: " + strClassPathComponente + " no Soporta Modelos Asociados List<E>.\n" + 
                            "Seleccione un Control adecuado para la Representación del Tipo de Dato.");
                    return false;
                }                
            }
            else{
                UtilRender.msgInformacion("Actualmente No existe Representación Válida para el Tipo de Dato Genérico " + strClassPathObject + ".\n" +
                        "Por favor, genere una representación para el Tipo de Dato Genérico que Representa\n" +
                        "el Elemento Object (E) de la Colección.");
                return false;
            }                        
        }        
        else if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractMap){
            String strClassPathKey = objTipoDato.getObjTiposGenericos().get(0).getStrClassPath();
            String strClassPathObject = objTipoDato.getObjTiposGenericos().get(1).getStrClassPath();                
            if(existeRepresentacionGenericaParaTipoDatoGenericoKey && existeRepresentacionGenericaParaTipoDatoGenericoObject){
                if (componentePermiteModeloAsociado) {
                    if (objComponenteDistribuidorBeansKey == null && objComponenteDistribuidorBeansObject != null) {                    
                        UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados Map<K, V> para el Tipo Genérico: <" + strClassPathKey + ">,\n" + 
                                "sin embargo no tiene representación asociada para el Elemento Key (K) de la Colección.\n" +
                                 "La Representación Genérica es Requerida para Continuar.");
                        return false;                    
                    }
                    else if (objComponenteDistribuidorBeansKey != null && objComponenteDistribuidorBeansObject == null) {
                        UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados Map<K, V>, para el Tipo Genérico: <" + strClassPathObject + ">,\n" +
                                "sin embargo no tiene representación asociada para el Elemento Object (V) de la Colección.\n" +
                                 "La Representación Genérica es Requerida para Continuar.");
                        return false;                    
                    }
                    else if (objComponenteDistribuidorBeansKey == null && objComponenteDistribuidorBeansObject == null) {
                        UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados Map<K, V>, para los Tipos Genéricos: <" + strClassPathKey + ", " + strClassPathObject + ">,\n" +
                                "sin embargo no tiene representaciones asociadas para los Elementos [Key, Object] (K, V) de la Colección.\n" +
                                 "La Representación Genérica es Requerida para Continuar.");
                        return false;                        
                    }
                }                                        
                else{
                    UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados Map<K, V>, para los Tipos Genéricos: <" + strClassPathKey + ", " + strClassPathObject + ">,\n" +
                            "sin embargo el Control: " + strClassPathComponente + " No Representa adecuadamente este tipo de Colección.\n" +
                            "Por favor, genere una representación válida para este tipo de Colección.");
                    return false;                      
                }
            }
            else if (!existeRepresentacionGenericaParaTipoDatoGenericoKey && existeRepresentacionGenericaParaTipoDatoGenericoObject) {
                UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados para Map<K, V>, sin embargo\n" + 
                        "Actualmente No existe Representación Válida para el Elemento Key (K) de la Colección: [" + strClassPathKey + "].\n" +
                        "Por favor, genere una representación para el Tipo de Dato Genérico que representa el Elemento Key (K) de la Colección Previamente.");
                return false;                        
            }
            else if (existeRepresentacionGenericaParaTipoDatoGenericoKey && !existeRepresentacionGenericaParaTipoDatoGenericoObject) {
                UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados para Map<K, V>, sin embargo\n" + 
                        "Actualmente No existe Representación Válida para el Elemento Object (V) de la Colección: [" + strClassPathObject + "].\n" +
                        "Por favor, genere una representación para el Tipo de Dato Genérico que representa el Elemento Object (V) de la Colección Previamente.");
                return false;                      
            }
            else{
                UtilRender.msgAdvertencia("El Tipo de Dato: " + strClassPathTipoDato + " Soporta Modelos Asociados para Map<K, V>, sin embargo\n" + 
                        "Actualmente No existe Representación Válida para los Elementos [Key, Object] (K, V) de la Colección: [" + strClassPathKey + ", " + strClassPathObject +"].\n" +
                        "Por favor, genere una representación para los Tipos de Dato Genéricos que representan los Elementos [Key, Object] (K, V) de la Colección Previamente.");
                return false;                      
            }
        }
        return true;
    }
    
    private boolean validacionesModeloAsociadoComponenteExtra(TipoColeccionModeloAsociado objTipoColeccionModeloAsociado){
        if (componentePermiteModeloAsociado) {
            return validacionModeloAsociadoPorComponente(objTipoColeccionModeloAsociado);                
        }
        return true;
    }
    
    private boolean validacionesModeloAsociadoComponenteGeneradorUnitario(TipoColeccionModeloAsociado objTipoColeccionModeloAsociado){
        if(tipoDatoIncluyeGenerico){
            return validacionModeloAsociadoPorTipoDato(objTipoColeccionModeloAsociado);
        }
        else if (componentePermiteModeloAsociado) {
            return validacionModeloAsociadoPorComponente(objTipoColeccionModeloAsociado);                
        }
        return false;
    }
    
    private boolean notificarCreacionComponenteExtra() {        
        TipoColeccionModeloAsociado objTipoColeccionModeloAsociado = GeneradorComponentes.devolverTipoColeccionModeloAsociado(objComponenteExtra.getObjClassSwing());
        if (componentePermiteModeloAsociado) {
            if(!validacionesModeloAsociadoComponenteExtra(objTipoColeccionModeloAsociado))return false;
            if(!UtilRender.msgConfirmar("¿Acepta la Representación Generada para el Componente?"))return false;
            int modoRepresentacion = ModeloAsociado.MODO_COLLECTION;
            ModeloAsociado objModeloAsociado = null;
            if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractList){
                objModeloAsociado = 
                        GeneradorComponentes.crearModeloAsociado(objTipoColeccionModeloAsociado, objComponenteExtra, objComponenteDistribuidorBeansObject, modoRepresentacion);                    
                if(objModeloAsociado != null){                    
                    objComponenteExtra.setObjModeloAsociado(objModeloAsociado);
                } 
            }        
            else if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractMap){
                objModeloAsociado = 
                    GeneradorComponentes.crearModeloAsociado(objTipoColeccionModeloAsociado, objComponenteExtra, objComponenteDistribuidorBeansObject, objComponenteDistribuidorBeansKey, modoRepresentacion);                    
                if(objModeloAsociado != null){                    
                    objComponenteExtra.setObjModeloAsociado(objModeloAsociado);
                }
            }
        }
        return UtilController.notificarObservador((Observer) objParent, objComponenteExtra, Bandera.COMPONENTE_EXTRA_CREADO);                
    }   

    private boolean notificarCreacionComponenteGeneracionUnitarioPersonalizado() {     
        ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteGenerador;
        if(tipoDatoEsColeccion){//La Creacion depende del Tipo de Dato
            TipoColeccionModeloAsociado objTipoColeccionModeloAsociado = GeneradorComponentes.devolverTipoColeccionModeloAsociado(objTipoDato.getObjClass());
            if(!validacionesModeloAsociadoComponenteGeneradorUnitario(objTipoColeccionModeloAsociado))return false;
            if(!UtilRender.msgConfirmar("¿Acepta la Representación Generada para el Componente?"))return false;
            int modoRepresentacion = GeneradorComponentes.devolverTipoRepresentacionModeloAsociado(objTipoDato);                
            ModeloAsociado objModeloAsociado = null;
            if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractList){
                objModeloAsociado = 
                        GeneradorComponentes.crearModeloAsociado(objTipoColeccionModeloAsociado, objComponenteGeneradorUnitario, objComponenteDistribuidorBeansObject, modoRepresentacion);                    
                if(objModeloAsociado != null){                    
                    objComponenteGeneradorUnitario.setObjModeloAsociado(objModeloAsociado);
                }
            }        
            else if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractMap){
                objModeloAsociado = 
                    GeneradorComponentes.crearModeloAsociado(objTipoColeccionModeloAsociado, objComponenteGeneradorUnitario, objComponenteDistribuidorBeansObject, objComponenteDistribuidorBeansKey, modoRepresentacion);                    
                if(objModeloAsociado != null){                    
                    objComponenteGeneradorUnitario.setObjModeloAsociado(objModeloAsociado);
                }
            }
        }        
        return UtilController.notificarObservador((Observer) objParent, objComponenteGeneradorUnitario, Bandera.COMPONENTE_GENERADOR_CREADO);                
    }

    private boolean notificarCreacionComponenteGenerado() {        
        if(!UtilRender.msgConfirmar("¿Acepta la Representación Generada para el Componente?"))return false;
        return UtilController.notificarObservador((Observer) objParent, objComponenteGenerado, Bandera.COMPONENTE_GENERADO_CREADO);                
    }

    private boolean notificarCreacionComponenteGeneradorUnitario() {
        ComponenteDistribuidorGeneradorUnitario objComponenteGeneradorUnitario = (ComponenteDistribuidorGeneradorUnitario) objComponenteGenerador;
        if(tipoDatoEsColeccion){//La Creacion depende del Tipo de Dato
            TipoColeccionModeloAsociado objTipoColeccionModeloAsociado = GeneradorComponentes.devolverTipoColeccionModeloAsociado(objTipoDato.getObjClass());
            if(!validacionesModeloAsociadoComponenteGeneradorUnitario(objTipoColeccionModeloAsociado))return false;
            if(!UtilRender.msgConfirmar("¿Acepta la Representación Generada para el Componente?"))return false;
            int modoRepresentacion = GeneradorComponentes.devolverTipoRepresentacionModeloAsociado(objTipoDato);                
            ModeloAsociado objModeloAsociado = null;
            if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractList){
                objModeloAsociado = 
                        GeneradorComponentes.crearModeloAsociado(objTipoColeccionModeloAsociado, objComponenteGeneradorUnitario, objComponenteDistribuidorBeansObject, modoRepresentacion);                    
                if(objModeloAsociado != null){                    
                    objComponenteGeneradorUnitario.setObjModeloAsociado(objModeloAsociado);
                }
            }        
            else if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractMap){
                objModeloAsociado = 
                    GeneradorComponentes.crearModeloAsociado(objTipoColeccionModeloAsociado, objComponenteGeneradorUnitario, objComponenteDistribuidorBeansObject, objComponenteDistribuidorBeansKey, modoRepresentacion);                    
                if(objModeloAsociado != null){                    
                    objComponenteGeneradorUnitario.setObjModeloAsociado(objModeloAsociado);
                }
            }
        }        
        return UtilController.notificarObservador((Observer) objParent, objComponenteGeneradorUnitario, Bandera.COMPONENTE_GENERADOR_CREADO);  
    }
    
    private ArrayList<ItemViewContenedor> prepararCreacionComponenteGenerador(){
        ArrayList<ItemViewContenedor> objItems = new ArrayList<ItemViewContenedor>();
        //se cargan por defecto
        objComponentesBasicos = GeneradorComponentes.objComponentesBase; 
        objComponentesPersonalizados = GeneradorComponentes.crearComponentesPersonalizadosBase();
        //se evalua que el tipo exista
        if(this.objTipoDato != null){
            //se obtiene la posible representacion
            TipoDatoRepresentacionBase objRepresentacionBaseTipoDato = 
                    GeneradorComponentes.devolverTipoDatoRepresentacionBasePorTipoDato(this.objTipoDato);
            //se evalua si existeArchivo
            if(objRepresentacionBaseTipoDato != null){
                //se evalua la compatibilidad del tipo para determinar que componentes
                //se podran utilizar pasra su posible creación
                ItemViewContenedor objItem = null;
                switch(objRepresentacionBaseTipoDato.getCompatibilidad()){
                    case TipoDatoRepresentacionBase.COMPATIBILIDAD_MODELOS_BASE:
                        
                        objComponentesBasicosRecomendados = GeneradorComponentes.devolverComponentesBasePorTipoDato(objTipoDato);
                        
                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BÁSICOS RECOMENDADOS"), TipoItemViewContenedor.eGeneracionComponentesBasicosRecomendados);
                        objItems.add(objItem);                        

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BASICOS"), TipoItemViewContenedor.eGeneracionComponentesBasicos);
                        objItems.add(objItem);

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES PERSONALIZADOS"), TipoItemViewContenedor.eGeneracionComponentesPersonalizados);
                        objItems.add(objItem);
                        break;
                    case TipoDatoRepresentacionBase.COMPATIBILIDAD_COMPONENTES_PERSONALIZADOS:
                        
                        objComponentesPersonalizadosRecomendados = GeneradorComponentes.devolverComponentesBasePersonalizadosPorTipoDato(objTipoDato);

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES PERSONALIZADOS RECOMENDADOS"), TipoItemViewContenedor.eGeneracionComponentesPersonalizadosRecomendados);
                        objItems.add(objItem);

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BASICOS"), TipoItemViewContenedor.eGeneracionComponentesBasicos);
                        objItems.add(objItem);

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES PERSONALIZADOS"), TipoItemViewContenedor.eGeneracionComponentesPersonalizados);
                        objItems.add(objItem);
                        
                        break;
                    case TipoDatoRepresentacionBase.COMPATIBILIDAD_MODELOS_COMPONENTES:
                        
                        objComponentesBasicosRecomendados = GeneradorComponentes.devolverComponentesBasePorTipoDato(objTipoDato);
                        objComponentesPersonalizadosRecomendados = GeneradorComponentes.devolverComponentesBasePersonalizadosPorTipoDato(objTipoDato);
                        
                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BÁSICOS RECOMENDADOS"), TipoItemViewContenedor.eGeneracionComponentesBasicosRecomendados);
                        objItems.add(objItem);

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES PERSONALIZADOS RECOMENDADOS"), TipoItemViewContenedor.eGeneracionComponentesPersonalizadosRecomendados);
                        objItems.add(objItem);

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BASICOS"), TipoItemViewContenedor.eGeneracionComponentesBasicos);
                        objItems.add(objItem);

                        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES PERSONALIZADOS"), TipoItemViewContenedor.eGeneracionComponentesPersonalizados);
                        objItems.add(objItem);
                        break;
                }                
            }
            else{
                //no existeArchivo, es imposible representar por defecto se carga los dos tipos                
                ItemViewContenedor objItem = null;               

                objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BASICOS"), TipoItemViewContenedor.eGeneracionComponentesBasicos);
                objItems.add(objItem);

                objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES PERSONALIZADOS"), TipoItemViewContenedor.eGeneracionComponentesPersonalizados);
                objItems.add(objItem);                
            }
        }
        return objItems;
    }
    
    private ArrayList<ItemViewContenedor> prepararCreacionComponenteExtra(){
        ArrayList<ItemViewContenedor> objItems = new ArrayList<ItemViewContenedor>();
        ItemViewContenedor objItem = null;
        //se cargan por defecto
        objComponentesBasicos = GeneradorComponentes.objComponentesBase; 
        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BASICOS"), TipoItemViewContenedor.eGeneracionComponentesBasicos);
        objItems.add(objItem);
        return objItems;
    }
    
    private ArrayList<ItemViewContenedor> prepararCreacionComponenteGenerado(){
        ArrayList<ItemViewContenedor> objItems = new ArrayList<ItemViewContenedor>();
        ItemViewContenedor objItem = null;
        //se cargan por defecto
        objComponentesBasicos = GeneradorComponentes.objComponentesBase;             
        objItem = new ItemViewContenedor(java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("CONTROLES BASICOS"), TipoItemViewContenedor.eGeneracionComponentesBasicos);
        objItems.add(objItem);        
        return objItems;
    }    

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jToolBar1 = new javax.swing.JToolBar();
        jButtonCrear = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        jButton3 = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        jButton1 = new javax.swing.JButton();
        jTabbedPaneComponente = new javax.swing.JTabbedPane();
        jPanel7 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jComboBoxTiposGeneracion = new javax.swing.JComboBox();
        jLabel5 = new javax.swing.JLabel();
        jComboBoxComponentes = new javax.swing.JComboBox();
        jTextFieldClassPath = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        jToolBar4 = new javax.swing.JToolBar();
        jButton4 = new javax.swing.JButton();
        jScrollPane3 = new javax.swing.JScrollPane();
        jTreeComponenteParent = new javax.swing.JTree();
        jLabel4 = new javax.swing.JLabel();
        jLabelInfo = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabelClassPathTipoDato = new javax.swing.JLabel();
        jSeparator5 = new javax.swing.JSeparator();
        jSeparator6 = new javax.swing.JSeparator();
        jPanel3 = new javax.swing.JPanel();
        jTabbedPaneModeloAsociado = new javax.swing.JTabbedPane();
        jPanel5 = new javax.swing.JPanel();
        jToolBar2 = new javax.swing.JToolBar();
        jButtonModeloAsociadoObject = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        jButtonDelModeloAsociadoObject = new javax.swing.JButton();
        jTabbedPaneModeloAsociadoObject = new javax.swing.JTabbedPane();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTreeComponenteBeansObject = new javax.swing.JTree();
        jScrollPane4 = new javax.swing.JScrollPane();
        jTreeClassBeanObject = new javax.swing.JTree();
        jPanel6 = new javax.swing.JPanel();
        jTabbedPaneModeloAsociadoKey = new javax.swing.JTabbedPane();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTreeComponenteBeansKey = new javax.swing.JTree();
        jScrollPane5 = new javax.swing.JScrollPane();
        jTreeClassBeanKey = new javax.swing.JTree();
        jToolBar3 = new javax.swing.JToolBar();
        jButtonModeloAsociadoKey = new javax.swing.JButton();
        jSeparator4 = new javax.swing.JToolBar.Separator();
        jButtonDelModeloAsociadoKey = new javax.swing.JButton();
        jPanel4 = new javax.swing.JPanel();
        jCheckBoxIngresoManual = new javax.swing.JCheckBox();
        jLabel3 = new javax.swing.JLabel();
        jLabelComponente = new javax.swing.JLabel();
        jTabbedPaneAvanzado = new javax.swing.JTabbedPane();
        jPanel2 = new javax.swing.JPanel();
        jCheckBoxAddComponentesGenerados = new javax.swing.JCheckBox();
        jTabbedPaneOpciones = new javax.swing.JTabbedPane();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance().getContext().getResourceMap(JDialogCrearComponenteManual.class);
        setTitle(resourceMap.getString("Form.title")); // NOI18N
        setBounds(new java.awt.Rectangle(0, 0, 0, 0));
        setName("Form"); // NOI18N
        setResizable(false);

        jToolBar1.setFloatable(false);
        jToolBar1.setRollover(true);
        jToolBar1.setName("jToolBar1"); // NOI18N

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance().getContext().getActionMap(JDialogCrearComponenteManual.class, this);
        jButtonCrear.setAction(actionMap.get("loadComponente")); // NOI18N
        jButtonCrear.setText(resourceMap.getString("jButtonCrear.text")); // NOI18N
        jButtonCrear.setFocusable(false);
        jButtonCrear.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonCrear.setName("jButtonCrear"); // NOI18N
        jButtonCrear.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButtonCrear);

        jSeparator3.setName("jSeparator3"); // NOI18N
        jToolBar1.add(jSeparator3);

        jButton3.setAction(actionMap.get("cancelar")); // NOI18N
        jButton3.setText(resourceMap.getString("jButton3.text")); // NOI18N
        jButton3.setFocusable(false);
        jButton3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton3.setName("jButton3"); // NOI18N
        jButton3.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton3);

        jSeparator2.setName("jSeparator2"); // NOI18N
        jToolBar1.add(jSeparator2);

        jButton1.setAction(actionMap.get("infoHelp")); // NOI18N
        jButton1.setFocusable(false);
        jButton1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton1.setName("jButton1"); // NOI18N
        jButton1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar1.add(jButton1);

        jTabbedPaneComponente.setName("jTabbedPaneComponente"); // NOI18N

        jPanel7.setName("jPanel7"); // NOI18N

        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N

        jComboBoxTiposGeneracion.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Seleccione el Tipo de Generación para el Componente" }));
        jComboBoxTiposGeneracion.setAction(actionMap.get("seleccionTipoGeneracion")); // NOI18N
        jComboBoxTiposGeneracion.setName("jComboBoxTiposGeneracion"); // NOI18N

        jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
        jLabel5.setName("jLabel5"); // NOI18N

        jComboBoxComponentes.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Selección el Componente ó Control (swing)" }));
        jComboBoxComponentes.setAction(actionMap.get("seleccion")); // NOI18N
        jComboBoxComponentes.setName("jComboBoxComponentes"); // NOI18N
        jComboBoxComponentes.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBoxComponentesActionPerformed(evt);
            }
        });

        jTextFieldClassPath.setEditable(false);
        jTextFieldClassPath.setText(resourceMap.getString("jTextFieldClassPath.text")); // NOI18N
        jTextFieldClassPath.setName("jTextFieldClassPath"); // NOI18N

        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N

        jToolBar4.setFloatable(false);
        jToolBar4.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jToolBar4.setRollover(true);
        jToolBar4.setBorderPainted(false);
        jToolBar4.setName("jToolBar4"); // NOI18N

        jButton4.setAction(actionMap.get("crearComponente")); // NOI18N
        jButton4.setFocusable(false);
        jButton4.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButton4.setName("jButton4"); // NOI18N
        jButton4.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar4.add(jButton4);

        jScrollPane3.setName("jScrollPane3"); // NOI18N

        jTreeComponenteParent.setName("jTreeComponenteParent"); // NOI18N
        jTreeComponenteParent.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTreeComponenteParentValueChanged(evt);
            }
        });
        jScrollPane3.setViewportView(jTreeComponenteParent);

        jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
        jLabel4.setName("jLabel4"); // NOI18N

        jLabelInfo.setBackground(resourceMap.getColor("jLabelInfo.background")); // NOI18N
        jLabelInfo.setText(resourceMap.getString("jLabelInfo.text")); // NOI18N
        jLabelInfo.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jLabelInfo.setName("jLabelInfo"); // NOI18N
        jLabelInfo.setOpaque(true);

        jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
        jLabel6.setName("jLabel6"); // NOI18N

        jLabelClassPathTipoDato.setBackground(resourceMap.getColor("jLabelClassPathTipoDato.background")); // NOI18N
        jLabelClassPathTipoDato.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabelClassPathTipoDato.setText(resourceMap.getString("jLabelClassPathTipoDato.text")); // NOI18N
        jLabelClassPathTipoDato.setToolTipText(resourceMap.getString("jLabelClassPathTipoDato.toolTipText")); // NOI18N
        jLabelClassPathTipoDato.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jLabelClassPathTipoDato.setName("jLabelClassPathTipoDato"); // NOI18N
        jLabelClassPathTipoDato.setOpaque(true);

        jSeparator5.setName("jSeparator5"); // NOI18N

        jSeparator6.setName("jSeparator6"); // NOI18N

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel6)
                    .addComponent(jLabel1)
                    .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, 100, Short.MAX_VALUE)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTextFieldClassPath, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jComboBoxComponentes, 0, 273, Short.MAX_VALUE)
                    .addComponent(jComboBoxTiposGeneracion, javax.swing.GroupLayout.PREFERRED_SIZE, 273, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelClassPathTipoDato))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jToolBar4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE)
                .addContainerGap(57, Short.MAX_VALUE))
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jSeparator6, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE)
                .addContainerGap(57, Short.MAX_VALUE))
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jSeparator5, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE)
                .addContainerGap(57, Short.MAX_VALUE))
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jLabelInfo, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE)
                .addContainerGap(57, Short.MAX_VALUE))
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addGap(10, 10, 10)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 389, Short.MAX_VALUE)
                .addGap(57, 57, 57))
        );

        jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jLabel1, jLabel2, jLabel5, jLabel6});

        jPanel7Layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {jComboBoxComponentes, jComboBoxTiposGeneracion, jLabelClassPathTipoDato, jTextFieldClassPath});

        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jToolBar4, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel7Layout.createSequentialGroup()
                        .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE, false)
                            .addComponent(jLabel6)
                            .addComponent(jLabelClassPathTipoDato))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jSeparator5, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(1, 1, 1)
                        .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel1)
                            .addComponent(jComboBoxTiposGeneracion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jComboBoxComponentes, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel5))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE, false)
                            .addComponent(jLabel2)
                            .addComponent(jTextFieldClassPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(11, 11, 11)
                        .addComponent(jSeparator6, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel4)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 197, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelInfo)))
                .addContainerGap())
        );

        jPanel7Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jComboBoxComponentes, jComboBoxTiposGeneracion, jLabelClassPathTipoDato, jTextFieldClassPath});

        jPanel7Layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jLabel1, jLabel2, jLabel5, jLabel6});

        jTabbedPaneComponente.addTab(resourceMap.getString("jPanel7.TabConstraints.tabTitle"), jPanel7); // NOI18N

        jPanel3.setName("jPanel3"); // NOI18N

        jTabbedPaneModeloAsociado.setName("jTabbedPaneModeloAsociado"); // NOI18N

        jPanel5.setName("jPanel5"); // NOI18N

        jToolBar2.setFloatable(false);
        jToolBar2.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jToolBar2.setRollover(true);
        jToolBar2.setBorderPainted(false);
        jToolBar2.setName("jToolBar2"); // NOI18N

        jButtonModeloAsociadoObject.setAction(actionMap.get("addModeloAsociadoObject")); // NOI18N
        jButtonModeloAsociadoObject.setText(resourceMap.getString("jButtonModeloAsociadoObject.text")); // NOI18N
        jButtonModeloAsociadoObject.setFocusable(false);
        jButtonModeloAsociadoObject.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonModeloAsociadoObject.setName("jButtonModeloAsociadoObject"); // NOI18N
        jButtonModeloAsociadoObject.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar2.add(jButtonModeloAsociadoObject);

        jSeparator1.setName("jSeparator1"); // NOI18N
        jToolBar2.add(jSeparator1);

        jButtonDelModeloAsociadoObject.setAction(actionMap.get("delModeloAsociadoObject")); // NOI18N
        jButtonDelModeloAsociadoObject.setFocusable(false);
        jButtonDelModeloAsociadoObject.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonDelModeloAsociadoObject.setName("jButtonDelModeloAsociadoObject"); // NOI18N
        jButtonDelModeloAsociadoObject.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar2.add(jButtonDelModeloAsociadoObject);

        jTabbedPaneModeloAsociadoObject.setName("jTabbedPaneModeloAsociadoObject"); // NOI18N

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        jTreeComponenteBeansObject.setName("jTreeComponenteBeansObject"); // NOI18N
        jTreeComponenteBeansObject.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTreeComponenteBeansObjectValueChanged(evt);
            }
        });
        jScrollPane1.setViewportView(jTreeComponenteBeansObject);

        jTabbedPaneModeloAsociadoObject.addTab(resourceMap.getString("jScrollPane1.TabConstraints.tabTitle"), jScrollPane1); // NOI18N

        jScrollPane4.setName("jScrollPane4"); // NOI18N

        jTreeClassBeanObject.setName("jTreeClassBeanObject"); // NOI18N
        jScrollPane4.setViewportView(jTreeClassBeanObject);

        jTabbedPaneModeloAsociadoObject.addTab(resourceMap.getString("jScrollPane4.TabConstraints.tabTitle"), jScrollPane4); // NOI18N

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPaneModeloAsociadoObject, javax.swing.GroupLayout.DEFAULT_SIZE, 358, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jToolBar2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jTabbedPaneModeloAsociadoObject, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE)
                    .addComponent(jToolBar2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE))
                .addContainerGap())
        );

        jTabbedPaneModeloAsociado.addTab(resourceMap.getString("jPanel5.TabConstraints.tabTitle"), jPanel5); // NOI18N

        jPanel6.setName("jPanel6"); // NOI18N

        jTabbedPaneModeloAsociadoKey.setName("jTabbedPaneModeloAsociadoKey"); // NOI18N

        jScrollPane2.setName("jScrollPane2"); // NOI18N

        jTreeComponenteBeansKey.setName("jTreeComponenteBeansKey"); // NOI18N
        jTreeComponenteBeansKey.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTreeComponenteBeansKeyValueChanged(evt);
            }
        });
        jScrollPane2.setViewportView(jTreeComponenteBeansKey);

        jTabbedPaneModeloAsociadoKey.addTab(resourceMap.getString("jScrollPane2.TabConstraints.tabTitle"), jScrollPane2); // NOI18N

        jScrollPane5.setName("jScrollPane5"); // NOI18N

        jTreeClassBeanKey.setName("jTreeClassBeanKey"); // NOI18N
        jScrollPane5.setViewportView(jTreeClassBeanKey);

        jTabbedPaneModeloAsociadoKey.addTab(resourceMap.getString("jScrollPane5.TabConstraints.tabTitle"), jScrollPane5); // NOI18N

        jToolBar3.setFloatable(false);
        jToolBar3.setOrientation(javax.swing.SwingConstants.VERTICAL);
        jToolBar3.setRollover(true);
        jToolBar3.setBorderPainted(false);
        jToolBar3.setName("jToolBar3"); // NOI18N

        jButtonModeloAsociadoKey.setAction(actionMap.get("addModeloAsociadoKey")); // NOI18N
        jButtonModeloAsociadoKey.setText(resourceMap.getString("jButtonModeloAsociadoKey.text")); // NOI18N
        jButtonModeloAsociadoKey.setFocusable(false);
        jButtonModeloAsociadoKey.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonModeloAsociadoKey.setName("jButtonModeloAsociadoKey"); // NOI18N
        jButtonModeloAsociadoKey.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar3.add(jButtonModeloAsociadoKey);

        jSeparator4.setName("jSeparator4"); // NOI18N
        jToolBar3.add(jSeparator4);

        jButtonDelModeloAsociadoKey.setAction(actionMap.get("delModeloAsociadoKey")); // NOI18N
        jButtonDelModeloAsociadoKey.setText(resourceMap.getString("jButtonDelModeloAsociadoKey.text")); // NOI18N
        jButtonDelModeloAsociadoKey.setFocusable(false);
        jButtonDelModeloAsociadoKey.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        jButtonDelModeloAsociadoKey.setName("jButtonDelModeloAsociadoKey"); // NOI18N
        jButtonDelModeloAsociadoKey.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        jToolBar3.add(jButtonDelModeloAsociadoKey);

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPaneModeloAsociadoKey, javax.swing.GroupLayout.DEFAULT_SIZE, 355, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jToolBar3, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jTabbedPaneModeloAsociadoKey, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE)
                    .addComponent(jToolBar3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE))
                .addContainerGap())
        );

        jTabbedPaneModeloAsociado.addTab(resourceMap.getString("jPanel6.TabConstraints.tabTitle"), jPanel6); // NOI18N

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPaneModeloAsociado, javax.swing.GroupLayout.DEFAULT_SIZE, 436, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPaneModeloAsociado, javax.swing.GroupLayout.DEFAULT_SIZE, 385, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPaneComponente.addTab(resourceMap.getString("jPanel3.TabConstraints.tabTitle"), jPanel3); // NOI18N

        jPanel4.setName("jPanel4"); // NOI18N

        jCheckBoxIngresoManual.setText(resourceMap.getString("jCheckBoxIngresoManual.text")); // NOI18N
        jCheckBoxIngresoManual.setEnabled(false);
        jCheckBoxIngresoManual.setName("jCheckBoxIngresoManual"); // NOI18N

        jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
        jLabel3.setName("jLabel3"); // NOI18N

        jLabelComponente.setBackground(resourceMap.getColor("jLabelComponente.background")); // NOI18N
        jLabelComponente.setText(resourceMap.getString("jLabelComponente.text")); // NOI18N
        jLabelComponente.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jLabelComponente.setName("jLabelComponente"); // NOI18N
        jLabelComponente.setOpaque(true);

        jTabbedPaneAvanzado.setName("jTabbedPaneAvanzado"); // NOI18N

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jTabbedPaneAvanzado, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 436, Short.MAX_VALUE)
                    .addComponent(jCheckBoxIngresoManual, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 436, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel4Layout.createSequentialGroup()
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabelComponente, javax.swing.GroupLayout.DEFAULT_SIZE, 365, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jCheckBoxIngresoManual)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jLabelComponente))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTabbedPaneAvanzado, javax.swing.GroupLayout.DEFAULT_SIZE, 340, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPaneComponente.addTab(resourceMap.getString("jPanel4.TabConstraints.tabTitle"), jPanel4); // NOI18N

        jPanel2.setName("jPanel2"); // NOI18N

        jCheckBoxAddComponentesGenerados.setSelected(true);
        jCheckBoxAddComponentesGenerados.setText(resourceMap.getString("jCheckBoxAddComponentesGenerados.text")); // NOI18N
        jCheckBoxAddComponentesGenerados.setEnabled(false);
        jCheckBoxAddComponentesGenerados.setName("jCheckBoxAddComponentesGenerados"); // NOI18N

        jTabbedPaneOpciones.setName("jTabbedPaneOpciones"); // NOI18N

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jTabbedPaneOpciones, javax.swing.GroupLayout.DEFAULT_SIZE, 436, Short.MAX_VALUE)
                    .addComponent(jCheckBoxAddComponentesGenerados, javax.swing.GroupLayout.DEFAULT_SIZE, 436, Short.MAX_VALUE))
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jCheckBoxAddComponentesGenerados)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTabbedPaneOpciones, javax.swing.GroupLayout.DEFAULT_SIZE, 364, Short.MAX_VALUE)
                .addContainerGap())
        );

        jTabbedPaneComponente.addTab(resourceMap.getString("jPanel2.TabConstraints.tabTitle"), jPanel2); // NOI18N

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 471, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(jTabbedPaneComponente, javax.swing.GroupLayout.DEFAULT_SIZE, 461, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(3, 3, 3)
                .addComponent(jTabbedPaneComponente)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jComboBoxComponentesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBoxComponentesActionPerformed
    }//GEN-LAST:event_jComboBoxComponentesActionPerformed

    private void jTreeComponenteBeansObjectValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeComponenteBeansObjectValueChanged
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) (evt.getPath().getLastPathComponent());
        Object nodeInfo = node.getUserObject();        
        try {
            this.objNodoSeleccionado = (InformacionNodo) nodeInfo;
            if(this.objNodoSeleccionado.getObjElemento() == null){                             
                return;
            }
            this.objSeleccionado = this.objNodoSeleccionado.getObjElemento();
            if (node.isRoot()) {
                //El nodo seleccionado es la raiz del arbol                                                
            } else if (node.isLeaf()) {
                //El nodo seleccionado es una hoja                                                
            } else {
                //El nodo seleccionado es una rama                           
            }            
            if(objSeleccionado instanceof Componente){
                UtilRender.createPopupMenuObjectSeleccionado(this, jTreeComponenteBeansObject, objSeleccionado);                                        
            }
        } catch (java.lang.ClassCastException ex) {
            Logger.getLogger(JDialogCrearComponenteManual.class.getName()).log(Level.SEVERE, null, ex);            
        }
    }//GEN-LAST:event_jTreeComponenteBeansObjectValueChanged

    private void jTreeComponenteBeansKeyValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeComponenteBeansKeyValueChanged
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) (evt.getPath().getLastPathComponent());
        Object nodeInfo = node.getUserObject();        
        try {
            this.objNodoSeleccionado = (InformacionNodo) nodeInfo;
            if(this.objNodoSeleccionado.getObjElemento() == null){                             
                return;
            }
            this.objSeleccionado = this.objNodoSeleccionado.getObjElemento();
            if (node.isRoot()) {
                //El nodo seleccionado es la raiz del arbol                                                
            } else if (node.isLeaf()) {
                //El nodo seleccionado es una hoja                                                
            } else {
                //El nodo seleccionado es una rama                           
            }            
            if(objSeleccionado instanceof ComponenteBeans){
                UtilRender.createPopupMenuObjectSeleccionado(this, jTreeComponenteBeansKey, objSeleccionado);                                        
            }
        } catch (java.lang.ClassCastException ex) {
            Logger.getLogger(JDialogCrearComponenteManual.class.getName()).log(Level.SEVERE, null, ex);            
        }
    }//GEN-LAST:event_jTreeComponenteBeansKeyValueChanged

    private void jTreeComponenteParentValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTreeComponenteParentValueChanged
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) (evt.getPath().getLastPathComponent());
        Object nodeInfo = node.getUserObject();        
        try {
            this.objNodoSeleccionado = (InformacionNodo) nodeInfo;
            if(this.objNodoSeleccionado.getObjElemento() == null){                             
                return;
            }
            this.objSeleccionado = this.objNodoSeleccionado.getObjElemento();
            if (node.isRoot()) {
                //El nodo seleccionado es la raiz del arbol                                                
            } else if (node.isLeaf()) {
                //El nodo seleccionado es una hoja                                                
            } else {
                //El nodo seleccionado es una rama                           
            }            
            if(objSeleccionado instanceof Componente){
                UtilRender.createPopupMenuObjectSeleccionado(this, jTreeComponenteParent, objSeleccionado);                                        
            }
        } catch (java.lang.ClassCastException ex) {
            Logger.getLogger(JDialogCrearComponenteManual.class.getName()).log(Level.SEVERE, null, ex);            
        }
    }//GEN-LAST:event_jTreeComponenteParentValueChanged

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                JDialogCrearComponenteManual dialog = new JDialogCrearComponenteManual(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void loadComponente() {
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_EXTRA:
                if(objComponenteExtra == null){
                    Utileria.mostrarMensaje(CuatroApp.getApplication().getMainFrame(), 
                            "Debe Crear el Componente Extra.", 
                            "", 
                            JOptionPane.WARNING_MESSAGE);
                    return;
                }
                break;
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                if(objComponenteGenerador == null){
                    Utileria.mostrarMensaje(CuatroApp.getApplication().getMainFrame(), 
                            "Debe Crear el Componente Generador.", 
                            "", 
                            JOptionPane.WARNING_MESSAGE);
                    return;
                }
                break;
            case Utileria.CREAR_COMPONENTE_GENERADO:                
                if(objComponenteGenerado == null){
                    Utileria.mostrarMensaje(CuatroApp.getApplication().getMainFrame(), 
                            "Debe Crear el Componente Generado.", 
                            "", 
                            JOptionPane.WARNING_MESSAGE);
                    return;
                }
                break;            
        }         
        if(!this.jCheckBoxIngresoManual.isSelected()){
            //Ingreso Automático
            if(this.jComboBoxComponentes.getSelectedIndex() >= 0){                
                if(this.jComboBoxComponentes.getSelectedItem() instanceof ComponenteBaseStandar){
                    notificarComponenteFromComponenteBase();
                }
                else if(this.jComboBoxComponentes.getSelectedItem() instanceof ComponenteBasePersonalizado){
                    notificarComponenteFromComponentePersonalizadoBase();
                }                              
            }
        }
        else{
            UtilRender.msgAdvertencia("Acción No Implementada.");
        }
    }
    
    private boolean crearComponenteFromComponenteBase(){
        try{
            ComponenteBaseStandar objComponenteBase = (ComponenteBaseStandar) this.jComboBoxComponentes.getSelectedItem();                                
            componentePermiteModeloAsociado = objComponenteBase.isPermiteModeloAsociado();
            switch(opcionModoCreacionComponente){
                case Utileria.CREAR_COMPONENTE_GENERADO:
                    objComponenteGenerado = 
                        GeneradorComponentes.crearComponenteGeneradoSimple(
                            objComponenteBase,
                            true
                        );                  
                    break;
                case Utileria.CREAR_COMPONENTE_EXTRA:
                    objComponenteExtra =
                        GeneradorComponentes.crearComponenteExtra(
                            objComponenteBase,
                            this.jCheckBoxAddComponentesGenerados.isSelected()
                        );
                    if(componentePermiteModeloAsociado){
                        jButtonModeloAsociadoObject.setEnabled(true);                           
                        UtilRender.helperIconInformationLabel(jLabelInfo, "El Componente Soporta Modelos Asociados.");
                    }
                    break;
                case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                    objComponenteGenerador = GeneradorComponentes.generarRepresentacionPorComponenteBase(
                                objComponenteBase, 
                                this.objTipoDato,
                                false,
                                true
                            );
                    if(tipoDatoEsColeccion){
                       if(tipoDatoIncluyeGenerico){
                           if(existeRepresentacionGenericaParaTipoDatoGenericoObject && existeRepresentacionGenericaParaTipoDatoGenericoKey){
                               jButtonModeloAsociadoObject.setEnabled(true); 
                               jButtonModeloAsociadoKey.setEnabled(true);
                               UtilRender.helperIconInformationLabel(jLabelInfo, "El Tipo de Dato presenta Representaciones Genéricas [Key, Object].");
                           }
                           else if(existeRepresentacionGenericaParaTipoDatoGenericoObject && !existeRepresentacionGenericaParaTipoDatoGenericoKey){
                               jButtonModeloAsociadoObject.setEnabled(true); 
                               jButtonModeloAsociadoKey.setEnabled(false);
                               UtilRender.helperIconInformationLabel(jLabelInfo, "El Tipo de Dato presenta Representaciones Genéricas [Object].");
                           }
                           else if(!existeRepresentacionGenericaParaTipoDatoGenericoObject && existeRepresentacionGenericaParaTipoDatoGenericoKey){
                               jButtonModeloAsociadoObject.setEnabled(false); 
                               jButtonModeloAsociadoKey.setEnabled(false);
                               UtilRender.helperIconWarningLabel(jLabelInfo, "El Tipo de Dato no ha sido Configurado Correctamente.");
                           }
                           else {
                               jButtonModeloAsociadoObject.setEnabled(false); 
                               jButtonModeloAsociadoKey.setEnabled(false);
                               UtilRender.helperIconWarningLabel(jLabelInfo, "No se Pueden Representar Los Tipos Genéricos.");
                           }
                       } 
                       else{
                           if(componentePermiteModeloAsociado){
                               if(tipoDatoPermiteModeloAsociadoObject && tipoDatoPermiteModeloAsociadoKey){
                                   jButtonModeloAsociadoObject.setEnabled(true);                           
                                   jButtonModeloAsociadoKey.setEnabled(true);
                                   UtilRender.helperIconInformationLabel(jLabelInfo, "El Componente Soporta Modelos Asociados [Key, Object].");
                               }
                               else if(tipoDatoPermiteModeloAsociadoObject && !tipoDatoPermiteModeloAsociadoKey){
                                   jButtonModeloAsociadoObject.setEnabled(true);                           
                                   jButtonModeloAsociadoKey.setEnabled(false);
                                   UtilRender.helperIconInformationLabel(jLabelInfo, "El Componente Soporta Modelos Asociados [Object].");
                               }
                               else if(tipoDatoPermiteModeloAsociadoObject && !tipoDatoPermiteModeloAsociadoKey){
                                   jButtonModeloAsociadoObject.setEnabled(false); 
                                   jButtonModeloAsociadoKey.setEnabled(false);
                                   UtilRender.helperIconWarningLabel(jLabelInfo, "El Tipo de Dato no ha sido Configurado Correctamente.");
                               }
                               else{
                                   jButtonModeloAsociadoObject.setEnabled(false); 
                                   jButtonModeloAsociadoKey.setEnabled(false);
                                   UtilRender.helperIconWarningLabel(jLabelInfo, "No se Pueden Representar Los Tipos Genéricos.");
                               }
                           }
                       }                       
                    }
                    else{
                        jButtonModeloAsociadoObject.setEnabled(false);
                        jButtonModeloAsociadoKey.setEnabled(false);
                        UtilRender.helperIconInformationLabel(jLabelInfo, "El Tipo de Dato no es una Colección.");
                    }
                    break;
            }   
            //cargarOpciones(objComponenteBase);
            return true;
        }catch(java.lang.Exception ex){
            Logger.getLogger(JDialogCrearComponenteManual.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return false;
    }
    
    private boolean crearComponenteFromComponentePersonalizadoBase(){
        try{
            ComponenteBasePersonalizado objComponentePersonalizadoBase = (ComponenteBasePersonalizado) this.jComboBoxComponentes.getSelectedItem();                        
            switch(opcionModoCreacionComponente){
                case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                    objComponenteGenerador =
                            GeneradorComponentes.crearComponenteGeneradorUnitario(objComponentePersonalizadoBase, this.objTipoDato.getStrClassPath());
                    objComponenteGenerador.setStrClassPathTipoDato(objTipoDato.getStrClassPath());
                    objComponenteGenerador.setObjTipoDato(objTipoDato);   
                    ComponenteBase objComponenteBase = GeneradorComponentes.devolverComponenteBaseGenerador(objComponenteGenerador);
                    componentePermiteModeloAsociado = objComponenteBase.isPermiteModeloAsociado();
                    if(tipoDatoEsColeccion){
                       if(tipoDatoIncluyeGenerico){
                           if(existeRepresentacionGenericaParaTipoDatoGenericoObject && existeRepresentacionGenericaParaTipoDatoGenericoKey){
                               jButtonModeloAsociadoObject.setEnabled(true); 
                               jButtonModeloAsociadoKey.setEnabled(true);
                               UtilRender.helperIconInformationLabel(jLabelInfo, "El Tipo de Dato presenta Representaciones Genéricas [Key, Object].");
                           }
                           else if(existeRepresentacionGenericaParaTipoDatoGenericoObject && !existeRepresentacionGenericaParaTipoDatoGenericoKey){
                               jButtonModeloAsociadoObject.setEnabled(true); 
                               jButtonModeloAsociadoKey.setEnabled(false);
                               UtilRender.helperIconInformationLabel(jLabelInfo, "El Tipo de Dato presenta Representaciones Genéricas [Object].");
                           }
                           else if(!existeRepresentacionGenericaParaTipoDatoGenericoObject && existeRepresentacionGenericaParaTipoDatoGenericoKey){
                               jButtonModeloAsociadoObject.setEnabled(false); 
                               jButtonModeloAsociadoKey.setEnabled(false);
                               UtilRender.helperIconWarningLabel(jLabelInfo, "El Tipo de Dato no ha sido Configurado Correctamente.");
                           }
                           else {
                               jButtonModeloAsociadoObject.setEnabled(false); 
                               jButtonModeloAsociadoKey.setEnabled(false);
                               UtilRender.helperIconWarningLabel(jLabelInfo, "No se Pueden Representar Los Tipos Genéricos.");
                           }
                       }  
                       else {
                           if(componentePermiteModeloAsociado){
                               if(tipoDatoPermiteModeloAsociadoObject && tipoDatoPermiteModeloAsociadoKey){
                                   jButtonModeloAsociadoObject.setEnabled(true);                           
                                   jButtonModeloAsociadoKey.setEnabled(true);
                                   UtilRender.helperIconInformationLabel(jLabelInfo, "El Componente Soporta Modelos Asociados [Key, Object].");
                               }
                               else if(tipoDatoPermiteModeloAsociadoObject  && !tipoDatoPermiteModeloAsociadoKey){
                                   jButtonModeloAsociadoObject.setEnabled(true);                           
                                   jButtonModeloAsociadoKey.setEnabled(false);
                                   UtilRender.helperIconInformationLabel(jLabelInfo, "El Componente Soporta Modelos Asociados [Object].");
                               }
                               else if(!tipoDatoPermiteModeloAsociadoObject && tipoDatoPermiteModeloAsociadoKey){
                                   jButtonModeloAsociadoObject.setEnabled(false); 
                                   jButtonModeloAsociadoKey.setEnabled(false);
                                   UtilRender.helperIconWarningLabel(jLabelInfo, "El Tipo de Dato no ha sido Configurado Correctamente.");
                               }
                               else{
                                   jButtonModeloAsociadoObject.setEnabled(true);                           
                                   jButtonModeloAsociadoKey.setEnabled(false);
                                   UtilRender.helperIconInformationLabel(jLabelInfo, "El Componente Soporta Modelos Asociados.");
                               }
                           }
                           else{
                               jButtonModeloAsociadoObject.setEnabled(false);
                               jButtonModeloAsociadoKey.setEnabled(false);
                               UtilRender.helperIconWarningLabel(jLabelInfo, "No es Posible Asociar Modelos Asociados.");
                           }
                       }                       
                    }
                    else{
                        jButtonModeloAsociadoObject.setEnabled(false);
                        jButtonModeloAsociadoKey.setEnabled(false);
                        UtilRender.helperIconInformationLabel(jLabelInfo, "El Tipo de Dato no es una Colección.");
                    }   
//                    if(objComponenteBase instanceof ComponenteBaseStandar){
//                        ComponenteBaseStandar objComponenteBaseStandar = (ComponenteBaseStandar) objComponenteBase;
//                        cargarOpciones(objComponenteBaseStandar);
//                    }
                    break;
            }                    
            return true;
        }catch(java.lang.Exception ex){
            Logger.getLogger(JDialogCrearComponenteManual.class.getName()).log(Level.SEVERE, null, ex);            
        }
        return false;
            
    }
    
    private void notificarComponenteFromComponenteBase(){        
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_GENERADO:                
                if(!notificarCreacionComponenteGenerado())return;
                dispose();  
                break;
            case Utileria.CREAR_COMPONENTE_EXTRA:                
                if(!notificarCreacionComponenteExtra())return;        
                dispose();  
                break;
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:                
                if(!notificarCreacionComponenteGeneradorUnitario())return;
                dispose();  
                break;
        }
    }
    
    private void notificarComponenteFromComponentePersonalizadoBase(){               
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                if(!notificarCreacionComponenteGeneracionUnitarioPersonalizado())return;  
                dispose();
                break;
        }        
    }

    /**
     * Cancela el proceso y sale de la ventana
     */
    @Action
    public void cancelar() {        
        if(UtilRender.msgConfirmar("¿Desea Cancelar el Proceso?", this)){
            if(UtilController.notificarObservador((Observer) objParent, Bandera.PROCESO_CANCELADO)){
                dispose();
            }
        }
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void seleccion() {
        if(this.jComboBoxComponentes.getSelectedIndex() >= 0){
            if(this.jComboBoxComponentes.getSelectedItem() instanceof ComponenteBaseStandar){
                ComponenteBaseStandar objComponenteBase = (ComponenteBaseStandar) this.jComboBoxComponentes.getSelectedItem();
                this.jTextFieldClassPath.setText(objComponenteBase.getStrClassPath());
                this.jLabelComponente.setText(objComponenteBase.getStrAlias());                                
            }
            else if(this.jComboBoxComponentes.getSelectedItem() instanceof ComponenteBasePersonalizado){
                ComponenteBasePersonalizado objComponentePersonalizadoBase = (ComponenteBasePersonalizado) this.jComboBoxComponentes.getSelectedItem();
                this.jTextFieldClassPath.setText(objComponentePersonalizadoBase.getStrAlias());
                this.jLabelComponente.setText(objComponentePersonalizadoBase.getStrTooltips());                
            }
        }
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void allComponentesBase() {        
        if(!Utileria.confirmarOrden(CuatroApp.getApplication().getMainFrame(), 
                java.util.ResourceBundle.getBundle("com/ufps/cuatro/vistas/resources/JDialogCrearComponenteManual").getString("¿DESEA CARGAR TODOS LOS COMPONENTES DISPONIBLES?"), 
                "")){
            return;
        }
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_EXTRA:
                objComponentesBasicos = GeneradorComponentes.objComponentesBase;
                break;
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                objComponentesBasicos = GeneradorComponentes.objComponentesBase;
                break;                                    
        }                
        JComboBox objCombo = new JComboBox(objComponentesBasicos.toArray());        
        this.jComboBoxComponentes.setModel(objCombo.getModel());
        if(this.jComboBoxComponentes.getItemCount() > 0){
            this.jComboBoxComponentes.setSelectedIndex(0);
        }
    }

    /**
     * Permite visualizar la ventana de ayuda
     */
    @Action
    public void infoHelp() {        
        UtilRender.openDialogHelp(JDialogCrearComponenteManual.class, getTitle());
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void seleccionTipoGeneracion() {
        if(this.jComboBoxTiposGeneracion.getSelectedIndex() >= 0){
            ItemViewContenedor objItem = (ItemViewContenedor) this.jComboBoxTiposGeneracion.getSelectedItem();
            if(objItem.geteTipoItem() == TipoItemViewContenedor.eGeneracionComponentesBasicosRecomendados){
                this.cargarComponentesBase(objComponentesBasicosRecomendados);
            }
            else if(objItem.geteTipoItem() == TipoItemViewContenedor.eGeneracionComponentesBasicos){
                this.cargarComponentesBase(objComponentesBasicos);                
            }
            else if(objItem.geteTipoItem() == TipoItemViewContenedor.eGeneracionComponentesPersonalizadosRecomendados){
                this.cargarComponentesPersonalizados(objComponentesPersonalizadosRecomendados);
            }        
            else if(objItem.geteTipoItem() == TipoItemViewContenedor.eGeneracionComponentesPersonalizados){
                this.cargarComponentesPersonalizados(objComponentesPersonalizados);
            }            
        }
    }
    
    private void cargarComponentesBase(ArrayList<ComponenteBaseStandar> objComponentes){                        
        JComboBox objCombo = new JComboBox(objComponentes.toArray());        
        this.jComboBoxComponentes.setModel(objCombo.getModel());
        if(this.jComboBoxComponentes.getItemCount() > 0){
            this.jComboBoxComponentes.setSelectedIndex(0);
        }        
    }
    
    private void cargarComponentesPersonalizados(ArrayList<ComponenteBasePersonalizado> objComponentes){                        
        JComboBox objCombo = new JComboBox(objComponentes.toArray());        
        this.jComboBoxComponentes.setModel(objCombo.getModel());
        if(this.jComboBoxComponentes.getItemCount() > 0){
            this.jComboBoxComponentes.setSelectedIndex(0);
        }        
    }

    /**
     * Permite tener una vista previa del componente creado
     */
    @Action
    public void previsualizarComponente() {
        UtilRender.msgAdvertencia("Acción No Implementada");
    }

    /**
     * Caga desde la BiBlioteca el componente deseado.
     */
    @Action
    public void addDesdeBiblioteca() {
        UtilRender.msgAdvertencia("Acción No Implementada");
    }

    /**
     * @DefinicionMetodo
     */
    @Action
    public void addModeloAsociadoFromBiblioteca() {
        UtilRender.msgAdvertencia("Acción No Implementada");
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JButton jButtonCrear;
    private javax.swing.JButton jButtonDelModeloAsociadoKey;
    private javax.swing.JButton jButtonDelModeloAsociadoObject;
    private javax.swing.JButton jButtonModeloAsociadoKey;
    private javax.swing.JButton jButtonModeloAsociadoObject;
    private javax.swing.JCheckBox jCheckBoxAddComponentesGenerados;
    private javax.swing.JCheckBox jCheckBoxIngresoManual;
    private javax.swing.JComboBox jComboBoxComponentes;
    private javax.swing.JComboBox jComboBoxTiposGeneracion;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabelClassPathTipoDato;
    private javax.swing.JLabel jLabelComponente;
    private javax.swing.JLabel jLabelInfo;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JToolBar.Separator jSeparator4;
    private javax.swing.JSeparator jSeparator5;
    private javax.swing.JSeparator jSeparator6;
    private javax.swing.JTabbedPane jTabbedPaneAvanzado;
    private javax.swing.JTabbedPane jTabbedPaneComponente;
    private javax.swing.JTabbedPane jTabbedPaneModeloAsociado;
    private javax.swing.JTabbedPane jTabbedPaneModeloAsociadoKey;
    private javax.swing.JTabbedPane jTabbedPaneModeloAsociadoObject;
    private javax.swing.JTabbedPane jTabbedPaneOpciones;
    private javax.swing.JTextField jTextFieldClassPath;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JToolBar jToolBar2;
    private javax.swing.JToolBar jToolBar3;
    private javax.swing.JToolBar jToolBar4;
    private javax.swing.JTree jTreeClassBeanKey;
    private javax.swing.JTree jTreeClassBeanObject;
    private javax.swing.JTree jTreeComponenteBeansKey;
    private javax.swing.JTree jTreeComponenteBeansObject;
    private javax.swing.JTree jTreeComponenteParent;
    // End of variables declaration//GEN-END:variables
    
    /**
     * 
     */
    @Action
    public void addModeloAsociadoObject() {
        if(UtilRepresentacion.objBibliotecaTrabajoLocal.isEmpty()){
            Utileria.mostrarMensaje(CuatroApp.getApplication().getMainFrame(), 
                    "No existen Componentes en la Biblioteca Local.", 
                    "", 
                    JOptionPane.WARNING_MESSAGE);
            return;
        }        
        JDialogSeleccionComponente objVentana = null;
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_EXTRA:
                //El Componente define las reglas del Modelo Asociado
                if(componentePermiteModeloAsociado){
                    objVentana = new JDialogSeleccionComponente(this, JDialogSeleccionComponente.SELECCION_COLECCION_OBJECT);
                }
                else{
                    UtilRender.msgError("Error de Representación del Modelo Asociado.");
                }
                break;
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                //Las Reglas del Modelo se pueden definir de dos formas
                //1. Por Tipo de Dato
                //2. Por Componente
                if(tipoDatoEsColeccion){
                    if(tipoDatoIncluyeGenerico){
                        if(existeRepresentacionGenericaParaTipoDatoGenericoObject){
                            try{
                                TipoColeccionModeloAsociado objTipoColeccionModeloAsociado = GeneradorComponentes.devolverTipoColeccionModeloAsociado(objTipoDato.getObjClass());
                                if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractList){
                                    if(!objTipoDato.getObjTiposGenericos().isEmpty()){
                                        ObjetoTipoDatoReflexion objTipoGenerico = objTipoDato.getObjTiposGenericos().get(0);
                                        objVentana = new JDialogSeleccionComponente(this, objTipoGenerico, JDialogSeleccionComponente.SELECCION_COLECCION_OBJECT, objTipoDato);                        
                                    }
                                    else{
                                        UtilRender.msgError("Error de Representación del Modelo Asociado.");
                                    }
                                }
                                else if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractMap){
                                    if(!objTipoDato.getObjTiposGenericos().isEmpty()){
                                        ObjetoTipoDatoReflexion objTipoGenerico = objTipoDato.getObjTiposGenericos().get(1);
                                        objVentana = new JDialogSeleccionComponente(this, objTipoGenerico, JDialogSeleccionComponente.SELECCION_COLECCION_OBJECT, objTipoDato);                        
                                    }
                                    else{
                                        UtilRender.msgError("Error de Representación del Modelo Asociado.");
                                    }
                                }
                            }catch(java.lang.NullPointerException ex){
                                UtilRender.msgError("Error de Representación del Modelo Asociado (Colección Nula).");
                            }catch(java.lang.ArrayIndexOutOfBoundsException ex){
                                UtilRender.msgError("Error de Representación del Modelo Asociado (Limite de Acceso No Permitido).");
                            }
                        }
                        else{
                            UtilRender.msgError("Error de Representación del Modelo Asociado.");
                        }
                    }
                    else if(componentePermiteModeloAsociado){
                        objVentana = new JDialogSeleccionComponente(this, JDialogSeleccionComponente.SELECCION_COLECCION_OBJECT);                        
                    }
                    else{
                        UtilRender.msgError("Error de Representación del Modelo Asociado.");
                    }
                } 
                else{
                    UtilRender.msgError("Error de Representación del Modelo Asociado.");
                }
                break;                                    
        }                   
        objVentana.setLocationRelativeTo(JDialogCrearComponenteManual.this);
        objVentana.setModal(true);
        CuatroApp.getApplication().show(objVentana);
    }

    public void update(Observable o, Object arg) {
        if(o instanceof Bandera){
            Bandera objBandera = (Bandera) o;
            switch(objBandera.getEstado()){                
                case Bandera.SELECCION_COMPONENTE_DISTRIBUIDOR:                    
                    if(objBandera.isOpcion(Bandera.OPC_SELECCION_COMPONENTE_DISTRIBUIDOR_OBJECT)){
                        objComponenteDistribuidorBeansObject = (ComponenteDistribuidor) objBandera.getObj();
                        cargarArbolComponenteDistribuidorBeansObject();
                        if(objComponenteDistribuidorBeansObject instanceof ComponenteDistribuidorGenerador){
                            cargarArbolObjetoTipoDatoReflexionObject();
                        }
                        else{
                            cargarArbolComponenteBeansObject();
                            cargarOpciones(objComponenteDistribuidorBeansObject.getObjComponenteBase());
                        }
                    }
                    else if(objBandera.isOpcion(Bandera.OPC_SELECCION_COMPONENTE_DISTRIBUIDOR_KEY)){
                        objComponenteDistribuidorBeansKey = (ComponenteDistribuidor) objBandera.getObj();
                        cargarArbolComponenteDistribuidorBeansKey();
                        if(objComponenteDistribuidorBeansKey instanceof ComponenteDistribuidorGenerador){
                            cargarArbolObjetoTipoDatoReflexionKey();
                        }
                        else{
                            cargarArbolComponenteBeansKey();
                        }
                    }                    
                    break;
            }
        }
    }

    /**
     * 
     */
    @Action
    public void delModeloAsociadoObject() {
        if(Utileria.confirmarOrden(CuatroApp.getApplication().getMainFrame(), "¿Desea Eliminar el Componente para la Representación\n" +
                "del Modelo Asociado para la Colección?", "")){             
            objComponenteDistribuidorBeansObject = null;
            jButtonDelModeloAsociadoObject.setEnabled(false);
        }        
    }  
    
    private void cargarArbolComponenteParent() {          
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_GENERADO:                
                UtilRender.helperRenderJTree(jTreeComponenteParent, 
                        objComponenteGenerado, 
                        Utileria.ARBOL_COMPONENTE, 
                        true, 0);                
                break;
            case Utileria.CREAR_COMPONENTE_EXTRA:  
                UtilRender.helperRenderJTree(jTreeComponenteParent, 
                        objComponenteExtra, 
                        Utileria.ARBOL_COMPONENTE, 
                        true, 0);                
                break;
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:                
                UtilRender.helperRenderJTree(jTreeComponenteParent, 
                        objComponenteGenerador, 
                        Utileria.ARBOL_COMPONENTE, 
                        true, 0);                
                break;
        }        
    }   
    
    private void cargarArbolComponenteDistribuidorBeansObject() {
        UtilRender.helperRenderJTree(jTreeComponenteBeansObject, 
                objComponenteDistribuidorBeansObject, 
                Utileria.ARBOL_COMPONENTE, 
                true, 0);
    }   
    
    private void cargarArbolComponenteBeansObject() {
        try{
            UtilRender.helperRenderJTree(jTreeClassBeanObject, 
                    objComponenteDistribuidorBeansObject.getObjComponenteBeans(), 
                    Utileria.ARBOL_ESTRUCTURA_COMPONENTE_BEANS, 
                    true, 0);
        }catch(java.lang.NullPointerException ex){
            UtilRender.helperRenderJTree(jTreeClassBeanObject, 
                    null, 
                    Utileria.ARBOL_ESTRUCTURA_COMPONENTE_BEANS, 
                    true, 0);    
        }
    }
    
    private void cargarArbolComponenteDistribuidorBeansKey() {
        UtilRender.helperRenderJTree(jTreeComponenteBeansKey, 
                objComponenteDistribuidorBeansKey, 
                Utileria.ARBOL_COMPONENTE, 
                true, 0);
    }  
    
    private void cargarArbolComponenteBeansKey() {
        try{
            UtilRender.helperRenderJTree(jTreeClassBeanKey, 
                    objComponenteDistribuidorBeansKey.getObjComponenteBeans(), 
                    Utileria.ARBOL_ESTRUCTURA_COMPONENTE_BEANS, 
                    true, 0);
        }catch(java.lang.NullPointerException ex){
            UtilRender.helperRenderJTree(jTreeClassBeanKey, 
                    null, 
                    Utileria.ARBOL_ESTRUCTURA_COMPONENTE_BEANS, 
                    true, 0);
        }
    }
    
    private void cargarArbolObjetoTipoDatoReflexionObject() {
        ComponenteDistribuidorGenerador objTempComponenteGenerador = (ComponenteDistribuidorGenerador) objComponenteDistribuidorBeansObject;
        UtilRender.helperRenderJTree(jTreeClassBeanObject, 
                objTempComponenteGenerador.getObjTipoDato(), 
                Utileria.ARBOL_TIPOS, 
                true, 0);
    }    
    
    private void cargarArbolObjetoTipoDatoReflexionKey() {
        ComponenteDistribuidorGenerador objTempComponenteGenerador = (ComponenteDistribuidorGenerador) objComponenteDistribuidorBeansKey;
        UtilRender.helperRenderJTree(jTreeClassBeanKey, 
                objTempComponenteGenerador.getObjTipoDato(), 
                Utileria.ARBOL_TIPOS, 
                true, 0);
    }

    /**
     * 
     */
    @Action
    public void viewCodeBeans() {
        UtilRender.msgAdvertencia("Acción No Implementada");
    }

    /**
     * 
     */
    @Action
    public void crearComponente() {
        if(!this.jCheckBoxIngresoManual.isSelected()){
            crearComponentePorSeleccion();
        }
        else{
            UtilRender.msgAdvertencia("Acción No Implementada");
        }
    }

    /**
     * 
     */
    @Action
    public void crearRepresentacionPorArchivo() {
        UtilRender.msgAdvertencia("Acción No Implementada");
    }

    /**
     * 
     */
    @Action
    public void addModeloAsociadoKey() {
        if(UtilRepresentacion.objBibliotecaTrabajoLocal.isEmpty()){
            Utileria.mostrarMensaje(CuatroApp.getApplication().getMainFrame(), 
                    "No existen Componentes en la Biblioteca Local.", 
                    "", 
                    JOptionPane.WARNING_MESSAGE);
            return;
        }        
        JDialogSeleccionComponente objVentana = null;
        switch(opcionModoCreacionComponente){
            case Utileria.CREAR_COMPONENTE_EXTRA:
                //El Componente define las reglas del Modelo Asociado
                if(componentePermiteModeloAsociado){
                    UtilRender.msgError("Error de Representación del Modelo Asociado.");
                }
                break;
            case Utileria.CREAR_COMPONENTE_GENERADOR_UNITARIO:
                //Las Reglas del Modelo se pueden definir de dos formas
                //1. Por Tipo de Dato
                //2. Por Componente
                if(tipoDatoEsColeccion){
                    if(tipoDatoIncluyeGenerico){
                        if(existeRepresentacionGenericaParaTipoDatoGenericoKey){
                            try{
                                TipoColeccionModeloAsociado objTipoColeccionModeloAsociado = GeneradorComponentes.devolverTipoColeccionModeloAsociado(objTipoDato.getObjClass());
                                if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractList){
                                    UtilRender.msgError("Error de Representación del Modelo Asociado.");                                
                                }
                                else if(objTipoColeccionModeloAsociado == TipoColeccionModeloAsociado.eAbstractMap){
                                    if(!objTipoDato.getObjTiposGenericos().isEmpty()){
                                        ObjetoTipoDatoReflexion objTipoGenerico = objTipoDato.getObjTiposGenericos().get(0);
                                        objVentana = new JDialogSeleccionComponente(this, objTipoGenerico, JDialogSeleccionComponente.SELECCION_COLECCION_KEY);                        
                                    }
                                    else{
                                        UtilRender.msgError("Error de Representación del Modelo Asociado.");
                                    }
                                }
                            }catch(java.lang.NullPointerException ex){
                                UtilRender.msgError("Error de Representación del Modelo Asociado (Colección Nula).");
                            }catch(java.lang.ArrayIndexOutOfBoundsException ex){
                                UtilRender.msgError("Error de Representación del Modelo Asociado (Limite de Acceso No Permitido).");
                            }
                        }
                        else{
                            UtilRender.msgError("Error de Representación del Modelo Asociado.");
                        }
                    }                    
                    else if(componentePermiteModeloAsociado){
                        objVentana = new JDialogSeleccionComponente(this, JDialogSeleccionComponente.SELECCION_COLECCION_KEY);                        
                    }
                    else{
                        UtilRender.msgError("Error de Representación del Modelo Asociado.");
                    }
                }
                else{
                    UtilRender.msgError("Error de Representación del Modelo Asociado.");
                }
                break;                                    
        }                   
        objVentana.setLocationRelativeTo(JDialogCrearComponenteManual.this);
        objVentana.setModal(true);
        CuatroApp.getApplication().show(objVentana);
    }

    /**
     * 
     */
    @Action
    public void delModeloAsociadoKey() {
        if(Utileria.confirmarOrden(CuatroApp.getApplication().getMainFrame(), "¿Desea Eliminar el Componente para la Representación\n" +
                "del Modelo Asociado para la Colección?", "")){             
            objComponenteDistribuidorBeansKey = null;              
            this.jButtonDelModeloAsociadoKey.setEnabled(false);
        }     
    }
    
    private void cargarOpciones(ComponenteBaseStandar objComponenteBaseStandard){
        switch(objComponenteBaseStandard.getIdPanelOpciones()){
            case Utileria.PANEL_OPCION_JLIST:
                if(objComponenteDistribuidorBeansObject instanceof ComponenteDistribuidorGeneradorUnitario){
                    cargarNoPanelOpcion(jTabbedPaneOpciones, "Opciones", "No Disponible");
                }
                else{
                    cargarPanelOpcionesJList();
                }
                break;
        }               
    }
    
    private void cargarPanelOpcionesJList() {
        jTabbedPaneOpciones.removeAll();
        JPanelOpcionesBeansAbstractList objPanel = new JPanelOpcionesBeansAbstractList(this, objComponenteDistribuidorBeansObject);
        jTabbedPaneOpciones.add("Opciones", objPanel);
    }
    
    private void cargarNoPanelOpcion(JTabbedPane objTab, String strTitulo, String strMsg){
        objTab.removeAll();
        objTab.add(strTitulo, UtilRender.etiquetaMsg(strMsg, Utileria.ICONO_TOOL_TIPS));
    }
    
}
